﻿/*给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。

说明：本题中，我们将空字符串定义为有效的回文串。

 

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释："amanaplanacanalpanama" 是回文串
示例 2:

输入: "race a car"
输出: false
解释："raceacar" 不是回文串
*/
#include<iostream>
using namespace std;
#include<string.h>
class Solution {
public:
    bool isPalindrome(string s) {
        int size=s.size();
        if(size<=1) return true;
        for(int i=0,j=size-1;i<j;i++,j--)
        {
            while((s[i]<'0'||s[i]>'9')&&(s[i]<'A'||s[i]>'Z')&&(s[i]<'a'||s[i]>'z')&&i<j)//只考虑字符和字母，左边加
                 ++i;
            while((s[j]<'0'||s[j]>'9')&&(s[j]<'A'||s[j]>'Z')&&(s[j]<'a'||s[j]>'z')&&i<j)//右边指针往左走
                 --j;
            if(s[i]!=s[j]&&(s[i]<'A' || s[j]<'A' || abs(s[i]-s[j])!=32)) return false; //比较左右指针所指内容，不同就报错  
        }
        return true;
    }
};
void main(){
	Solution m;
	string s="amanaplanacanalpanama";
	cout<<m.isPalindrome(s)<<endl;
	system("pause");
}